package com.rbn.stockmobiledevices.salidas;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.rbn.stockmobiledevices.clientes.Cliente;
import com.rbn.stockmobiledevices.dispositivos.Dispositivo;
import com.rbn.stockmobiledevices.utils.AutoCompleteElement;

@Controller
public class VentaController {
	
	private VentaManager ventaManager;
	
	@Autowired 
	public VentaController(VentaManager proveedorManager) {
		this.ventaManager = proveedorManager;
	}
	
	@RequestMapping(value="/getVentaDetail", method=RequestMethod.GET)
	public @ResponseBody Venta getDetail(@RequestParam long imei) {
		Venta v = ventaManager.getById(imei);
	    return v;
	}
	
	@RequestMapping(value="/removeVenta", method=RequestMethod.GET)
	public @ResponseBody Map<String, Boolean> remove(@RequestParam long imei) {
		boolean result = ventaManager.remove(imei);
		HashMap<String, Boolean> valueReturn = new HashMap<String, Boolean>();
		valueReturn.put("status", result);
	    return valueReturn;
	}
	
	@RequestMapping(value = "/pagarSalida", method = RequestMethod.GET)
	public @ResponseBody Map<String, Object> pagarSalida(@RequestParam long imei) {
		HashMap<String, Object> valueReturn = new HashMap<String, Object>();
		boolean result = true;
		try{
			Venta venta = ventaManager.getById(imei);
			venta.setPagado(true);
			ventaManager.update(venta);
		}catch(Exception e){
			result=false;
		}
		valueReturn.put("status", result);
		
		return valueReturn;
	}
	
	@RequestMapping(value="/updateVenta", method=RequestMethod.GET)
	public @ResponseBody Map<String, Object> update(@RequestParam long imei, @RequestParam String dispositivo, @RequestParam double precio, @RequestParam String fecha, @RequestParam int cliente, @RequestParam String observacion, @RequestParam boolean pagado) {
		HashMap<String, Object> valueReturn = new HashMap<String, Object>();
		boolean result = true;
		
		Cliente c = null;
		Dispositivo d = null;
		Date fechaVenta = null;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		String mensaje="";
		try{
			fechaVenta = sdf.parse(fecha);
			d = ventaManager.getDispositivoByCodigo(dispositivo);
			c = ventaManager.getClienteById(cliente);
			
			Venta venta = ventaManager.getById(imei);
			venta.setCliente(c);
			venta.setDispositivo(d);
			venta.setFechaVenta(fechaVenta);
			venta.setPrecioVenta(precio);
			venta.setObservacion(observacion);
			venta.setPagado(pagado);
			ventaManager.update(venta);
			mensaje = "La salida se actualizo correctamente";
		}catch(Exception e){
			mensaje = "Ocurrio un error al intentar eliminar la salida";
			result = false;
		}
		valueReturn.put("status", result);
		valueReturn.put("mensaje", mensaje);
	    return valueReturn;
	}
	
	@RequestMapping(value="/addVenta", method=RequestMethod.GET)
	public @ResponseBody Map<String, Object> add(@RequestParam long imei, @RequestParam String dispositivo, @RequestParam double precio, @RequestParam String fecha, @RequestParam int cliente, @RequestParam String observacion, @RequestParam boolean pagado) {
		boolean result = true;
		Venta venta = new Venta();
		Dispositivo d = null;
		Cliente c = null;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date fechaVenta = null; 
		String mensaje = "";
		try{
			fechaVenta = sdf.parse(fecha);
			d = ventaManager.getDispositivoByCodigo(dispositivo);
			c = ventaManager.getClienteById(cliente);
			venta.setImei(imei);
			venta.setDispositivo(d);
			venta.setCliente(c);
			venta.setPrecioVenta(precio);
			venta.setFechaVenta(fechaVenta);
			venta.setObservacion(observacion);
			venta.setPagado(pagado);
			ventaManager.save(venta);
			mensaje="<strong>La salida se realizo correctamente</strong><br/>"+
				"Imei: " + imei + "<br/>" +
				"Celular: cod(" + d.getCodigo() + ") modelo(" + d.getModelo() + ")<br/>" +
				"Cliente: " + c.getNombre() + "<br/>" +
				"Precio de venta: " + precio + "<br/>" +
				"Observaciones: " + observacion + "<br/>" +
				"Fecha de compra: " + fecha;
		}catch (Exception e) {
			mensaje = "<strong>ERROR!!</strong><br/>Ocurrio un error al intentar hacer la salida";
			result = false;
		}
		HashMap<String, Object> valueReturn = new HashMap<String, Object>();
		valueReturn.put("status", result);
		valueReturn.put("mensaje", mensaje);
		
	    return valueReturn;
	}
	
	@RequestMapping(value = "/salidas", method = RequestMethod.GET)
	public String ventaList(Model model) {
		return "ventas.tiles";
	}
	
	@RequestMapping(value = "/salidasTable", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, Object> getListaVentas(@RequestParam int iDisplayStart, @RequestParam int iDisplayLength, @RequestParam String sEcho,
			@RequestParam(value="sSearch_0") Long flt_imei, 
			@RequestParam(value="sSearch_1") String flt_dispositivo, 
			@RequestParam(value="sSearch_2") Integer flt_cliente, 
			@RequestParam(value="sSearch_3") String flt_fecha) {
		
		flt_dispositivo=flt_dispositivo!=null?flt_dispositivo.trim():"";
		Map<String, Object> map = new HashMap<String, Object>();
		List<Venta> ventas = new ArrayList<Venta>();
		int total = 0;
		int filtered = 0;
		try{
			Date fecha = null;
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
			if(flt_fecha!=null && flt_fecha.length()>0){
				try {
					fecha = sdf.parse(flt_fecha);
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}
			
			ventas = ventaManager.getAll();
			total = ventas.size();
			filtered = total;
			
			filtered = ventaManager.getPaginadoVentas(null, null, flt_imei, flt_dispositivo, flt_cliente, fecha).size();
			ventas   = ventaManager.getPaginadoVentas(iDisplayStart, iDisplayLength, flt_imei, flt_dispositivo, flt_cliente, fecha);
		
		}catch(Exception e){
			
		}
		
		map.put("sEcho", sEcho);
		map.put("iTotalRecords", String.valueOf(total));
		map.put("iTotalDisplayRecords", String.valueOf(filtered));
		map.put("salidas", ventas);

		return map;
	}
	
	@RequestMapping(value = "/autoCompleteCliente", method = RequestMethod.GET)
	public @ResponseBody List<AutoCompleteElement> findProveedores(@RequestParam(value="term") String search) {
		List<AutoCompleteElement> lista = ventaManager.getClienteOptionsByModelo(search);
		return lista;
	}
	
}